<?php
/*
 * Implementa��o do item de compra Material.
 * Esta classe representa os materiais que podem ser adquiridos pela institui��o.
 * Um material � composto por:
 * C�digo (CATMAT) - c�digo �nico do material cadastrado SIASG
 * Nome - Nome do servi�o.
 * Descri��o - Descreve  o servi�o.
 * Codigo Aberto - Booleano para informar se o c�digo vinculado ao servi�o � aberto ou n�o.
 * Medida - Informações referentes a unidade de medida do material.
 * Valor - Pre�o de refer�ncia do material.
 * Grupo - Categoria associada ao material.
 */

//if( !function_exists('__autoload') )
//{
//    function __autoload($class_name) {
//    require_once $class_name . '.php';
//    }
//}

require_once 'MaterialDAO.php';
require_once 'Objeto.php';
function catMatToUTF($string) {
	$map = array(
			'\u00c3\u0080' => 'À',
			'\u00c3\u0081' => 'Á',
			'\u00c3\u0082' => 'Â',
			'\u00c3\u0083' => 'Ã',
			'\u00c3\u0084' => 'Ä',
			'\u00c3\u0085' => 'Å',
			'\u00c3\u0086' => 'Æ',
			'\u00e3\u0080' => 'à',
			'\u00e3\u0081' => 'á',
			'\u00e3\u0082' => 'â',
			'\u00e3\u0083' => 'ã',
			'\u00e3\u0084' => 'ä',
			'\u00e3\u0085' => 'å',
			'\u00e3\u0086' => 'æ',
			'\u00c3\u0087' => 'Ç',
			'\u00e3\u0087' => 'ç',
			'\u00c3\u0090' => 'Ð',
			'\u00e3\u0090' => 'ð',
			'\u00c3\u0088' => 'È',
			'\u00c3\u0089' => 'É',
			'\u00c3\u008a' => 'Ê',
			'\u00c3\u008b' => 'Ë',
			'\u00e3\u0088' => 'è',
			'\u00e3\u0089' => 'é',
			'\u00e3\u008a' => 'ê',
			'\u00e3\u008b' => 'ë',
			'\u00c3\u00ac' => 'Ì',
			'\u00c3\u00ad' => 'Í',
			'\u00c3\u00ae' => 'Î',
			'\u00c3\u00af' => 'Ï',
			'\u00e3\u00ac' => 'ì',
			'\u00e3\u00ad' => 'í',
			'\u00e3\u00ae' => 'î',
			'\u00e3\u00af' => 'ï',

                        '\u00c3\u008c' => 'Ì',
			'\u00c3\u008d' => 'Í',
			'\u00c3\u008e' => 'Î',
			'\u00c3\u008f' => 'Ï',
			'\u00e3\u008c' => 'ì',
			'\u00e3\u008d' => 'í',
			'\u00e3\u008e' => 'î',
			'\u00e3\u008f' => 'ï',

                        '\u00c3\u0091' => 'Ñ',
			'\u00e3\u0091' => 'ñ',
			'\u00c3\u0092' => 'Ò',
			'\u00c3\u0093' => 'Ó',
			'\u00c3\u0094' => 'Ô',
			'\u00c3\u0095' => 'Õ',
			'\u00c3\u0096' => 'Ö',
			'\u00c3\u0098' => 'Ø',
			'\u00c5\u0092' => 'Œ',
			'\u00e3\u0092' => 'ò',
			'\u00e3\u0093' => 'ó',
			'\u00e3\u0094' => 'ô',
			'\u00e3\u0095' => 'õ',
			'\u00e3\u0096' => 'ö',
			'\u00e3\u0098' => 'ø',
			'\u00c5\u0093' => 'œ',
			'\u00c3\u0099' => 'Ù',
			'\u00c3\u009a' => 'Ú',
			'\u00c3\u009b' => 'Û',
			'\u00c3\u009c' => 'Ü',
			'\u00e3\u0099' => 'ù',
			'\u00e3\u009a' => 'ú',
			'\u00e3\u009b' => 'û',
			'\u00e3\u009c' => 'ü',
			'\u00c3\u009d' => 'Ý',
			'\u00c5\u00b8' => 'Ÿ',
			'\u00e3\u009d' => 'ý',
			'\u00e3\u009f' => 'ÿ',

	);
		$string = str_replace(array_keys($map), array_values($map), $string);
		return $string;
	}

class Material extends Objeto
{
	protected $medida;			// Array de informa��es sobre a medida do Material.
	protected $valor;			// Valor de refer�ncia do material. Este valor est� no formato inteiro sendo necess�rio utilizar a fun��o number_format() p/ exibi-lo no formato monet�rio.
	protected $grupo;			// Grupo ao qual pertence o material
	protected $quantidade;		// Quantidade do objeto
	protected $tipo;			// se é serviço ou material

	public function __construct( $id = NULL, $codigo = NULL, $especificacao = NULL, $medida = NULL, $valor = NULL, $grupo = NULL, $quantidade = NULL, $compraId = NULL, $tipo=NULL )
	{
		parent::__construct( $id, $compraId, $codigo, $especificacao  );
		$this->medida = $medida;
		$this->valor = $valor;
		$this->grupo = $grupo;
		$this->quantidade = $quantidade;
		$this->tipo = $tipo;
		$this->dao = new MaterialDAO();
	}

	public function setCodigo( $codigo )
	{
		$this->codigo = $codigo;
	}

	/**
	 * Insere um registro no banco de dados na tabela t_material com os dados do objeto.
	 * @return - Retorna TRUE caso a opera��o seja efetuada com sucesso ou FALSE caso contr�rio.
    */
	public function Salvar()
	{
		if(strstr($this->tipo , "material"))
			$resultado = $this->dao->Salvar( $this );
		else
			$resultado = $this->dao->SalvarServico($this);
		return $resultado;
	}

	/**
	 * Altera o registro no banco de dados na tabela t_material associado ao objeto.
	 * @return - Retorna TRUE caso a opera��o seja efetuada com sucesso ou FALSE caso contr�rio.
	*/
	public function Atualizar()
	{
		if(strstr($this->tipo , "material")){
			$resultado = $this->dao->Atualizar( $this );


                }else{

                        $resultado = $this->dao->AtualizarServico( $this );
                }
                 return $resultado;
	}

	/**
	 * Exclui um registro no banco de dados da tabela t_material.
	 * @param $materialId - Chave-prim�ria no banco de dados do material.
	 * @return - Retorna TRUE caso a opera��o seja efetuada com sucesso ou FALSE caso contr�rio.
	*/
	public function Remover( $materialId )
	{
		$resultado = $this->dao->Remover( $materialId );
		return $resultado;
	}

	public function RemoverPorProcesso( $processoId )
	{
		$resultado = $this->dao->RemoverPorProcesso( $processoId );
		return $resultado;
	}

	private function postRequest( $queryString )
	{
		$url = 'https://www.comprasnet.gov.br/XML/treinamento/consultamatserv.asp';
		$ch = curl_init( $url );
		curl_setopt($ch, CURLOPT_POST, 1); // Define o m�todo de envio como POST
		curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-type: application/x-www-form-urlencoded charset=ISO-8859-1')); // Define qual conte�do ser� enviado
		curl_setopt($ch, CURLOPT_POSTFIELDS, $queryString); // Consulta que será enviada
		curl_setopt($ch, CURLOPT_RETURNTRANSFER ,1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER ,0);
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		$resultadoConsulta = curl_exec ($ch);
		curl_close ($ch);

		return $resultadoConsulta;
	}

	private function xmlParaObjeto( $xml )
	{


		if( $xml->erronat == 0 && $xml->erroxml == 0)
		{

                        $materiais = array();

			for($i = 0; $i < count($xml->itens->item); $i++ )
			{
				$unidadesFornecimento = array();
				for($x = 0; $x < count($xml->itens->item[$i]->unidades->unidade); $x++ )
				{
					$uf = array(
					'unidadeFornecimento'=>(string)$xml->itens->item[$i]->unidades->unidade[$x]->unidade_fornecimento,
					'sigla'=>(string)$xml->itens->item[$i]->unidades->unidade[$x]->sigla_unidade_fornecimento,
					'capacidade'=>(int)$xml->itens->item[$i]->unidades->unidade[$x]->capacidade,
					'unidadeMedida'=>(string)$xml->itens->item[$i]->unidades->unidade[$x]->unidade_medida
					);
					$unidadesFornecimento[] = $uf;
				}
				setlocale(LC_ALL, 'pt_BR');
				
                                $descricaoMaterial =  catMatToUTF(json_encode(iconv("ISO-8859-1", "UTF-8//IGNORE", strtolower($xml->itens->item[$i]->descricao))));
				$descricaoMaterial = substr($descricaoMaterial, 1, strlen($descricaoMaterial)-3);
				$m = new Material( 0, (int)$xml->itens->item[$i]->codigo, $descricaoMaterial, $unidadesFornecimento, 0, $xml->itens->item[$i]->classe);
				$materiais[] = $m;
			}

			return $materiais;
		}
		else
		{
			if( $xml->erronat != 0 )
				throw new Exception((string)$xml->descnat, (int)$xml->erronat);
			else if( $xml->erroxml != 0 )
				throw new Exception((string)$xml->descxml, (int)$xml->erroxml);
		}
	}

        // Busca nova na base local - tabela t_catmat -
        public function BuscarMateriaisPorNome( $nomeMaterial ){

            $resultado = $this->dao->BuscarMaterialCatMatPorNome($nomeMaterial);
            return $resultado;
        }

        public function SalvarNovoMaterialCatMat($catmat){
            $resultado = $this->dao->SalvarNovoMaterialCatMat($catmat);
            return $resultado;
        }

        /* // Busca antiga feita em XML na base direta do SERPRO
	public function BuscarMateriaisPorNome( $nomeMaterial )
	{
		$nomeMaterial = utf8_decode($nomeMaterial);
		$nomeMaterial = str_replace(' e ', '', $nomeMaterial);
		$nomeMaterial = str_replace(' de ', '', $nomeMaterial);
		$nomeMaterial = explode(" ", $nomeMaterial, 3 );



		$consulta = '<?xml version="1.0" encoding="ISO-8859-1"?>
		<cnet xmlns="cnet_consultamatserv">
		<ambiente>treinamento</ambiente>
		<sistema>XML</sistema>
		<cpf>86139819415</cpf>
		<senha>lulu21</senha>
		<acao>consulta material</acao>
		<codigo_item></codigo_item>';

		if( isset( $nomeMaterial[0]) )
		{
			$consulta .= "<radical1>$nomeMaterial[0]</radical1>";
		}
		else
			$consulta .= "<radical1></radical1>";

		if( isset( $nomeMaterial[1]) )
		{
			$consulta .= "<radical2>$nomeMaterial[1]</radical2>";
		}
		else
			$consulta .= "<radical2></radical2>";

		if( isset( $nomeMaterial[2]) )
		{
			$consulta .= "<radical3>$nomeMaterial[2]</radical3>";
		}
		else
			$consulta .= "<radical3></radical3>";
			$consulta .= "<sustentavel></sustentavel>";
		$consulta .= "</cnet>";

		$httpQuery = array('xml'=>$consulta);
		$query = http_build_query($httpQuery);
		$resultado = $this->postRequest( $query );


		$xml = new SimpleXMLElement($resultado);
		try
		{
                        print_r($xml);
			$materiais = $this->xmlParaObjeto($xml);
			return $materiais;
		}catch( Exception $e )
		{
			throw new Exception($e->getMessage(), $e->getCode() );
		}

	}
	*/

        public function BuscarMaterialCatMatPorCodigo( $codMaterial ){
             $resultado = $this->dao->BuscarMaterialCatMatPorCodigo($codMaterial);
            return $resultado;
        }

        // Busca antiga feita em XML na base direta do SERPRO
	public function BuscarMaterialPorCodigo( $catmat )
	{

		if( $catmat != 0 && $catmat != '' )
		{
			$consulta = '<?xml version="1.0" encoding="ISO-8859-1"?>
			<cnet xmlns="cnet_consultamatserv">
			<ambiente>treinamento</ambiente>
			<sistema>XML</sistema>
			<cpf>86139819415</cpf>
			<senha>lulu21</senha>
			<acao>consulta material</acao>
			<codigo_item>'.$catmat.'</codigo_item>
			<radical1></radical1>
			<radical2></radical2>
			<radical3></radical3>
			<sustentavel></sustentavel>
			</cnet>';

			$httpQuery = array('xml'=>$consulta);
			$query = http_build_query($httpQuery);
			$resultado = $this->postRequest( $query );

			$xml = new SimpleXMLElement($resultado);

			try
			{

                            $materiais = $this->xmlParaObjeto($xml);
			    return $materiais;
			}catch( Exception $e )
			{
				throw new Exception($e->getMessage(), $e->getCode() );
			}

		}
		else
		{
			throw new Exception("Codigo informado de maneira incorreta!");
		}



	}




	/**
	 * Transforma o array com os registros retornados da tabela t_material em objetos do tipo Material.
	 * @param $array - Array com os registros retornados de uma consulta a tabela t_servico.
	 * @return Retorna um array de objetos do tipo Material ou FALSE caso o argumento informado n�o seja do tipo requerido.
	 */
	static public function ArrayParaObjetos( $array )
	{
		if( !is_array($array) ) // Verifica se o argumento recebido � um array, caso n�o seja interrompe a execu��o do m�todo.
			return FALSE;

		$objetos = array();
		for( $i = 0; $i < count( $array ); $i++ )
		{
			$unidadeFornecimento = array();

			if( array_key_exists('id', $array[0] ) )
			{
		//		$compraDao = new Processo();
		//		$compra = $compraDao->CarregarProcesso($array[$i]['t_compra_id']);

		//		if(strstr($compra->tipoProcesso, "material")){
				$id = $array[$i]['id'];
				if($array[$i]['codigo'] != NULL && $array[$i]['codigo'] != 0 ){

					$m = explode( '|', $array[$i]['medida'] );
					$medida = array( 'unidadeFornecimento'=>$m[0],
							 'sigla'=>$m[1],
							 'capacidade'=>(int)$m[2],
							 'unidadeMedida'=>$m[3] );

				}else{
					$medida = $array[$i]['medida'];

				}
				$compraId = $array[$i]['t_compra_id'];
			}
			else
			{
				$id = 0;
				if(strstr($array[$i]['tipo'], "material")){
					$medida = array( 'unidadeFornecimento'=>$array[$i]['unidadeFornecimento'],
							 'sigla'=>$array[$i]['sigla'],
							 'capacidade'=>(int)$array[$i]['capacidade'],
							 'unidadeMedida'=>$array[$i]['unidadeMedida'] );
				}else{
					$medida = $array[$i]['medida'];

				}
				$compraId = 0;

			}

			$unidadeFornecimento[] = $medida;

			$material = new Material( $id,
									  $array[$i]['codigo'],
									  $array[$i]['especificacao'],
									  $unidadeFornecimento,
									  $array[$i]['valor'],
									  $array[$i]['grupo'],
									  $array[$i]['quantidade'],
									  $compraId );
			$objetos[] = $material;
		}
		return $objetos;
	}

	public function CarregarMateriaisPorProcesso( $processoId )
	{
		$resultado = $this->dao->CarregarMateriaisPorProcesso( $processoId );
		return $resultado;
	}

	public function CarregarMaterialPorId( $materialId )
	{
		$resultado = $this->dao->CarregarMaterialPorId( $materialId );
		return $resultado;
	}

	public function CarregarMaterialPorProcessoCodigoEUnidade( $processoId, $codigoId, $medida ){
		$resultado = $this->dao->CarregarMaterialPorProcessoECodigo( $processoId, $codigoId, $medida );
		return $resultado;
	}

	public function CarregarServicoPorProcessoEspecificacaoEMaterial($processoId, $especificacao, $medida){
		$resultado = $this->dao->CarregarServicoPorProcessoEspecificacaoEMaterial($processoId, $especificacao, $medida);
		return $resultado;
	}












	/**
	 * Transforma um array de objetos Material em uma string no formato XML contendo as informa��es dos Materiais.
	 * @param $array - Array de objetos do tipo Material.
	 * @return Retorna uma string no formato XML contendo as informa��es dos Materiais.
	 */
	static public function ArrayParaXML( $material )
	{
		$xml = "<materiais>\n";

		if( is_array($material) )
		{
			for( $i = 0; $i < count( $material ); $i++ )
			{
				$xml .= "<material>\n";
				$xml .= "<id>".$material[$i]->id."</id>\n";
	            $xml .= "<categoria>".$material[$i]->categoria->id."</categoria>\n";
	            $xml .= "<catmat>".$material[$i]->codigo."</catmat>\n";
	            $xml .= "<nome>".$material[$i]->nome."</nome>\n";
	            $xml .= "<descricao><![CDATA[".$material[$i]->especificacao."]]></descricao>\n";
	            $xml .= "<valor>".$material[$i]->valor."</valor>\n";
	            $xml .= "<unidadeId>".$material[$i]->medida['id']."</unidadeId>\n";
	            $xml .= "<sigla>".$material[$i]->medida['sigla']."</sigla>\n";
	            $xml .= "<capacidade>".$material[$i]->medida['capacidade']."</capacidade>\n";
	            $xml .= "<medida>".$material[$i]->medida['medida']."</medida>\n";
	            $xml .= "</material>\n";
			}
		}
		else if( is_a($material, 'Material') )
		{
			$xml .= "<material>\n";
			$xml .= "<id>".$material->id."</id>\n";
            $xml .= "<categoria>".$material->categoria->id."</categoria>\n";
            $xml .= "<catmat>".$material->codigo."</catmat>\n";
            $xml .= "<nome>".$material->nome."</nome>\n";
            $xml .= "<descricao><![CDATA[".$material->especificacao."]]></descricao>\n";
            $xml .= "<valor>".$material->valor."</valor>\n";
            $xml .= "<unidadeId>".$material->medida['id']."</unidadeId>\n";
            $xml .= "<sigla>".$material->medida['sigla']."</sigla>\n";
            $xml .= "<capacidade>".$material->medida['capacidade']."</capacidade>\n";
            $xml .= "<medida>".$material->medida['medida']."</medida>\n";
            $xml .= "</material>\n";
		}
		else
			return FALSE;

		$xml .= "</materiais>\n";

		return $xml;
	}
}
?>